import Cookies from 'js-cookie';
import XEUtils from 'xe-utils';

import { defineStore } from 'pinia';
import { ElMessage } from 'element-plus';

import { AuthUtils } from '@/utils/auth';
import { useLoginApi, useSystemApi } from '@/api';

// 其他的store
import { useThemeConfig } from '@/stores/themeConfig';
import { useUserStore, useUserInfo } from '@/stores/modules/store-user';

const defaultSysParams = {
	// 系统名称
	sysName: '',
	// 系统简称
	sysShortName: '',
	// 等保级别：1-等保一级 2-等保二级 3-等保三级 4-等保四级
	protectLevel: 4,
	// 系统签名
	sysCopyright: 'Copyright 2016 北京大数元科技发展有限公司 版权所有 All rights reserved.',
	// 备案信息
	filingContent: '京ICP备17001091号-1',
};
const defaultExternalCallConfig = {
	callId: '',
	isCall: false,
	systemName: '辽宁省地方政府债券穿透式全流程管理系统',
	logoutPath: 'http://192.168.2.201:8170/page/frame/bootstrap/userLoginDzWw.jsp?login=USER_CANCEL',
};

/**
 * 处理登录的通用方法
 */
export const useSystemStore = defineStore('system', {
	state: () => ({
		// 权限token
		token: AuthUtils.accessToken.get(),
		// 系统模式：['custom', 'develop', 'development', 'production']
		envMode: import.meta.env.MODE,
		// 系统参数
		systemParams: XEUtils.clone(defaultSysParams, true),
		// 是否开启请求服务器
		openRequestServer: true,
		// 外部系统调用配置
		externalCallConfig: XEUtils.clone(defaultExternalCallConfig, true),
	}),
	actions: {
		// 退出登录
		signOut(apiTimeout = false) {
			return new Promise((resolve, reject) => {
				if (this.openRequestServer) {
					useLoginApi()
						.logout()
						.then((res) => {
							this.clearAllCache();
							this.jumpToLoginPage(apiTimeout);
							resolve(true);
						})
						.catch((err) => {
							this.clearAllCache();
							reject(err);
						});
				} else {
					this.clearAllCache();
					this.jumpToLoginPage();
					resolve(true);
				}
			});
		},
		// 后端登录
		signInBack(params) {
			return new Promise((resolve, reject) => {
				useLoginApi()
					.login(params)
					.then((res) => {
						const { code, data, msg } = res;
						if (code == 200) {
							const { Authorization } = data;
							this.token = Authorization;
							AuthUtils.accessToken.set(Authorization);
							resolve(true);
						} else {
							this.token = '';
							AuthUtils.accessToken.remove();
							ElMessage.error(msg);
							resolve(false);
						}
					})
					.catch((err) => {
						this.token = '';
						AuthUtils.accessToken.remove();
						console.error(err);
						resolve(false);
					});
			});
		},
		// 前端登录
		signInFront(params) {
			return new Promise((resolve, reject) => {
				// 前端登录生产token
				const token = Math.random().toString(36).substring(0);
				this.token = token;
				// 缓存token，用于前端路由跳转时做登录判断
				AuthUtils.accessToken.set(token);
				// 模拟数据，对接接口时，记得删除多余代码及对应依赖的引入。用于 `/src/stores/userInfo.ts` 中不同用户登录判断（模拟数据）
				Cookies.set('userName', params?.userName || 'admin');
				// 返回参数信息
				resolve(true);
			});
		},
		// 穿透式登录
		signInExternalCall(params) {
			return new Promise((resolve, reject) => {
				useLoginApi()
					.externalCallLogin(params)
					.then((res) => {
						const { code, data, msg } = res;
						if (code == 200) {
							const { Authorization } = data;
							this.token = Authorization;
							AuthUtils.setToken(params.sid, Authorization);
							AuthUtils.accessToken.set(Authorization);
						} else {
							this.token = '';
							AuthUtils.removeToken(params.sid, Authorization);
							AuthUtils.accessToken.remove(Authorization);
							console.error(msg);
						}
						resolve(res);
					})
					.catch((err) => {
						this.token = '';
						AuthUtils.removeToken(params.sid, Authorization);
						AuthUtils.accessToken.remove(Authorization);
						console.error(err);
					});
			});
		},
		// 情况所有缓存
		clearAllCache() {
			this.token = '';
			if (this.openRequestServer) {
				useUserInfo().clearUserInfo();
				useUserStore().clearUser();
			}
			// 系统参数
			this.systemParams = XEUtils.clone(defaultSysParams, true);
			// 清空浏览器缓存排除了主题设置
			Object.keys(localStorage).forEach((key) => {
				if (!key.includes('themeConfig')) {
					localStorage.removeItem(key);
				}
			});
			Object.keys(sessionStorage).forEach((key) => {
				if (!key.includes('themeConfig')) {
					sessionStorage.removeItem(key);
				}
			});
			Object.keys(Cookies.get()).forEach((key) => {
				Cookies.remove(key);
			});
		},
		// 清楚缓存
		clearSignInCache() {
			this.token = '';
			AuthUtils.accessToken.remove();
		},
		// 跳转登录页面
		jumpToLoginPage(apiTimeout) {
			if (this.externalCallConfig.isCall) {
				window.location.href = this.externalCallConfig.logoutPath;
			} else {
				if (apiTimeout) {
					sessionStorage.setItem('timeout', Math.random().toString(36).substring(0));
				}
				window.location.reload();
			}
		},
		// 设置系统参数
		setSystemParams() {
			return new Promise((resolve) => {
				if (this.openRequestServer) {
					useSystemApi()
						.getSysParams()
						.then((res) => {
							const { code, data, msg } = res;
							if (code === 200) {
								this.systemParams = { ...this.systemParams, ...data };
								const { sysIsGrayscale, sysIsPageWatermark, sysWatermarkText, sysFrameLoginName, sysIsFooter } = data;
								// 开启底部栏
								useThemeConfig().themeConfig.isFooter = sysIsFooter && Number(sysIsFooter) === 1;
								// 灰色模式
								useThemeConfig().themeConfig.isGrayscale = sysIsGrayscale && Number(sysIsGrayscale) === 1;
								// 是否水印
								useThemeConfig().themeConfig.isWartermark = sysIsPageWatermark && Number(sysIsPageWatermark) === 1;
								// 水印文案
								useThemeConfig().themeConfig.wartermarkText = sysWatermarkText || sysFrameLoginName;
								// 全局网站名称
								useThemeConfig().themeConfig.globalTitle = data.sysFrameLogoName;
								// 全局副标题
								useThemeConfig().themeConfig.globalViceTitle = data.sysFrameLoginName;
							} else {
								console.log('err', msg);
							}
						})
						.catch((err) => {
							console.log('err', err);
						});
				} else {
					// 前端控制路由 不做任何操作
				}
			});
		},
		// 设置外部调用配置
		setExterCallConfig(config) {
			this.externalCallConfig = { ...this.externalCallConfig, ...config };
		},
	},
});
